package com.tdam2011.grupo06.control;

import java.util.Comparator;
import java.util.Date;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.provider.CallLog;
import android.provider.ContactsContract;

import com.tdam2011.grupo06.R;
import com.tdam2011.grupo06.gui.ListadoHistorial.ItemHistorialAdapter;
import com.tdam2011.grupo06.gui.SetPreferenceFiltrarHistorial;
import com.tdam2011.grupo06.model.Contacto;
import com.tdam2011.grupo06.model.ItemEmail;
import com.tdam2011.grupo06.model.ItemHistorial;
import com.tdam2011.grupo06.model.Llamada;
import com.tdam2011.grupo06.model.Mensaje;
import com.tdam2011.grupo06.model.MensajeBob;

public class GestorHistorial 
{
	private Context context;
	private boolean actualizar = false;
	private static String CONTENT_SMS = "content://sms";
	private static String CONTENT_MMS = "content://mms";
	private static String ID = "_id";
	private static String ADDRESS = "address";
	
	public GestorHistorial(Context c)
	{
		context = c;
	}
	
	public void actualizar()
	{
		actualizar = true;
	}
	
	public ItemHistorialAdapter cargarHistorial(ItemHistorialAdapter adapter)
	{
		ContentResolver cr = context.getContentResolver();
		
		ItemHistorial item;
		Comparator<ItemHistorial> comparator = getComparator();
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
		
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_LLAMADAS, true))
    	{
	        Cursor telCur = cr.query(CallLog.Calls.CONTENT_URI, null, null, null, null);
	        while (telCur.moveToNext()) 
		    {
		    	String id = telCur.getString(telCur.getColumnIndex(CallLog.Calls._ID));
		        String numero = telCur.getString(telCur.getColumnIndex(CallLog.Calls.NUMBER));
		        String tipo = telCur.getString(telCur.getColumnIndex(CallLog.Calls.TYPE));
		        Date fecha = new Date(telCur.getLong(telCur.getColumnIndex(CallLog.Calls.DATE)));
		        
		        String[] aux = parseCarga(cr, numero, adapter);
	    		numero = aux[2];
	 	        
	 	        item = new Llamada(Integer.parseInt(id),Integer.parseInt(aux[0]),Integer.parseInt(tipo),fecha,numero,aux[1]);
	 	        adapter.addItemInfo(item);
	 		}
	        telCur.close();
    	}
        
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_SMS, true))
    	{
	        Cursor smsCur = cr.query(Uri.parse(CONTENT_SMS), null, null, null, null);
	        while (smsCur.moveToNext()) 
		    {
	        	String id = smsCur.getString(smsCur.getColumnIndex(ID));
		    	String numero = smsCur.getString(smsCur.getColumnIndex(ADDRESS));
		    	Date fecha = new Date(smsCur.getLong(smsCur.getColumnIndex("date")));
		    	String tipo = smsCur.getString(smsCur.getColumnIndex("type"));
	    		
		    	if (numero!=null)
		    	{
		    		String[] aux = parseCarga(cr, numero, adapter);
		    		numero = aux[2];
	 	        
		 	        item = new Mensaje(Integer.parseInt(id),Integer.parseInt(aux[0]),Integer.parseInt(tipo),fecha,numero,aux[1],1);
		 	        adapter.addItemInfo(item);
		    	}
		    	else
		    	{
		    		adapter.addBorr();
		    	}
	 		}
	        smsCur.close();
    	}
        
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_MMS, true))
    	{
	    	Cursor mmsCur = cr.query(Uri.parse(CONTENT_MMS), null, null, null, null);
	        while (mmsCur.moveToNext()) 
		    {
	        	String id = mmsCur.getString(mmsCur.getColumnIndex(ID));
	        	long timestamp = mmsCur.getLong(mmsCur.getColumnIndex("date"))* 1000;//Necesario para los mms
	    	    Date fecha = new Date(timestamp);
		    	String numero="";
		    	String tipo="0";
				
	    		Uri uriAddr = Uri.parse (CONTENT_MMS+"/" + id + "/addr");
	    		Cursor mmsCur2 = cr.query(uriAddr,null,"type=137",null,null);
	    	    if(mmsCur2.moveToNext())
	    	    {
	    	    	numero = mmsCur2.getString (mmsCur2.getColumnIndex (ADDRESS));
	    	    	if(numero.contentEquals("insert-address-token"))
	    	    	{
	    	    		mmsCur2.close();
	    	    		mmsCur2 = cr.query(uriAddr,null,"type=151", null,null);
	    	    		if(mmsCur2.moveToNext())
	    	    		{
	    	    			numero = mmsCur2.getString(mmsCur2.getColumnIndex(ADDRESS));
	    	    			tipo = "2";
	    	    		}
	    	    	}
	    	    	else
	    	    	{
	    	    		tipo = "1";
	    	    	}
	    	    }
	    	    mmsCur2.close();
		    	    
	    	    if (numero!=null)
		    	{
	    	    	String[] aux = parseCarga(cr, numero, adapter);
		    		numero = aux[2];
		 	        
		 	        item = new Mensaje(Integer.parseInt(id),Integer.parseInt(aux[0]),Integer.parseInt(tipo),fecha,numero,aux[1],2);
		 	        adapter.addItemInfo(item);
		    	}
	 		}
	        mmsCur.close();
    	}
        
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_EMAIL, true))
    	{
	    	Cursor mailCur = DatabaseHelper.getInstance(context).getAllEmails();
	        while (mailCur.moveToNext()) 
		    {
	        	String id = mailCur.getString(mailCur.getColumnIndex(DatabaseHelper.emailsID));
		    	String numero = mailCur.getString(mailCur.getColumnIndex(DatabaseHelper.direction));
		    	Date fecha = new Date(mailCur.getLong(mailCur.getColumnIndex(DatabaseHelper.fechaHora)));
	    		
		    	String[] aux = cargarContactoEmail(cr,numero, adapter);
	 	        
	 	        item = new ItemEmail(Integer.parseInt(id),Integer.parseInt(aux[0]),2,fecha,numero,aux[1]);
	 	        adapter.addItemInfo(item);
	 		}
	        mailCur.close();
    	}
    	
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_WEB, true))
    	{
	    	Cursor bobCur = DatabaseHelper.getInstance(context).getAllMensajesBob();
	        while (bobCur.moveToNext()) 
		    {
	        	int id = bobCur.getInt(bobCur.getColumnIndex(DatabaseHelper.mensajeID));
	        	int tipo = bobCur.getInt(bobCur.getColumnIndex(DatabaseHelper.mensajeType));
		    	Date fecha = new Date(bobCur.getLong(bobCur.getColumnIndex(DatabaseHelper.mensajeFecha)));
		    	int idContacto = bobCur.getInt(bobCur.getColumnIndex(DatabaseHelper.mensajeContactID));
		    	Contacto c = new Contacto();
		    	c.setTableID(idContacto);
		    	c = DatabaseHelper.getInstance(context).getContactByTableId(c);
	    		String usuario = c.getUsuario();
	    		String nombre = "";
	    		if(c.getDbId()!=0)
	    		{
	    			nombre = cargarContactoMensajeBob(cr, c.getDbId(), adapter);
	    		}
	 	        
	 	        item = new MensajeBob(id,tipo,fecha,"",usuario);
	 	        item.setNombre(nombre);
	 	        item.setNumero(usuario);
	 	        item.setIdContacto(c.getDbId());
	 	        adapter.addItemInfo(item);
	 		}
	        bobCur.close();
    	}
        
        if(comparator!=null)
        {
        	adapter.ordenarHistorial(comparator);
        }
        else
        {
        	adapter.ordenarHistorial(ItemHistorial.comparadorFechaDesc);
        }
        
        return adapter;
	}
	
	private String[] cargarContacto(ContentResolver cr, String numero, ItemHistorialAdapter adapter)
	{
		String idContacto = "0";
        String nombre = numero;
        
        Cursor pCur = cr.query(Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, numero),null,null,null, null);
        while (pCur.moveToNext())
        {
        	idContacto = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
        	if(adapter.getContactoById(Integer.parseInt(idContacto))==null)
        	{
        		Cursor cCur = cr.query(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(idContacto)), null, null, null, null);
        		if (cCur.moveToFirst()) 
        		{
        			nombre = cCur.getString(cCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
	        		
			        Uri uriPhoto = StrUriPhoto.getInstance().getPhotoUriById(context, Integer.parseInt(idContacto));
			        adapter.addContacto( new Contacto(Integer.parseInt(idContacto),nombre, uriPhoto) );
        		}
        		cCur.close();
        	}
        	else
        	{
        		nombre = adapter.getContactoById(Integer.parseInt(idContacto)).getNombre();
        	}
        } 
        pCur.close();
        
        return new String[]{idContacto,nombre};
	}
	
	private String[] cargarContactoEmail(ContentResolver cr, String mail, ItemHistorialAdapter adapter)
	{
		String idContacto = "0";
        String nombre = mail;
        
        Cursor pCur = cr.query(Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, mail),null,null,null, null);
        while (pCur.moveToNext())
        {
        	idContacto = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID));
        	if(adapter.getContactoById(Integer.parseInt(idContacto))==null)
        	{
        		Cursor cCur = cr.query(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(idContacto)), null, null, null, null);
        		if (cCur.moveToFirst()) 
        		{
        			nombre = cCur.getString(cCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
	        		
			        Uri uriPhoto = StrUriPhoto.getInstance().getPhotoUriById(context, Integer.parseInt(idContacto));
			        adapter.addContacto( new Contacto(Integer.parseInt(idContacto),nombre, uriPhoto) );
			        
        		}
        		cCur.close();
        	}
        	else
        	{
        		nombre = adapter.getContactoById(Integer.parseInt(idContacto)).getNombre();
        	}
        } 
        pCur.close();
        
        return new String[]{idContacto,nombre};
	}
	
	private String cargarContactoMensajeBob(ContentResolver cr, int idContacto, ItemHistorialAdapter adapter)
	{
		String nombre = "";
        
		if(adapter.getContactoById(idContacto)==null)
    	{
    		Cursor cCur = cr.query(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, ((long) idContacto)), null, null, null, null);
    		if (cCur.moveToFirst()) 
    		{
    			nombre = cCur.getString(cCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        		
		        Uri uriPhoto = StrUriPhoto.getInstance().getPhotoUriById(context, idContacto);
		        adapter.addContacto( new Contacto(idContacto,nombre, uriPhoto) );
    		}
    		cCur.close();
    	}
    	else
    	{
    		nombre = adapter.getContactoById(idContacto).getNombre();
    	}
        
        return nombre;
	}

	public boolean verificarHistorial(ItemHistorialAdapter adapter) 
	{
		ContentResolver cr = context.getContentResolver();
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
		
		if(actualizar) {actualizar = false; return true;}
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_LLAMADAS, true))
    	{
			Cursor telCur = cr.query(CallLog.Calls.CONTENT_URI, null, null, null, null);
			if(telCur.getCount()!=adapter.getCantTel()) {return true;}
    	}
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_SMS, true))
    	{
    		Cursor smsCur = cr.query(Uri.parse(CONTENT_SMS), null, null, null, null);
    		if(smsCur.getCount()!=(adapter.getCantMenSms()+adapter.getCantBorr())) {return true;}
    	}
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_MMS, true))
    	{
    		Cursor mmsCur = cr.query(Uri.parse(CONTENT_MMS), null, null, null, null);
    		if(mmsCur.getCount()!=adapter.getCantMenMms()) {return true;}
    	}
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_EMAIL, true))
    	{
    		if(DatabaseHelper.getInstance(context).getEmailsCount()!=adapter.getCantEmail()) {return true;}
    	}
    	if(myPreference.getBoolean(SetPreferenceFiltrarHistorial.HISTORIAL_WEB, true))
    	{
    		if(DatabaseHelper.getInstance(context).getMensajesBobCount()!=adapter.getCantMensajesBob()) {return true;}
    	}
		return false;
	}
	
	private Comparator<ItemHistorial> getComparator() 
	{
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
    	String[] order = context.getResources().getStringArray(R.array.ordenamietoHistorial);
    	String orden = myPreference.getString("ordenamietoHistorial", "");
		int i;
    	for (i = 0; i<order.length; i++)
    	{
    		if(order[i].compareTo(orden)==0)
    		{
    			break;
    		}
    	}
    	switch (i) 
    	{
    		case 0:
    			return ItemHistorial.comparadorNombreAsc;
    		case 1:
    			return ItemHistorial.comparadorNombreDesc;
    		case 2:
    			return ItemHistorial.comparadorFechaAsc;
    		case 3:
    			return ItemHistorial.comparadorFechaDesc;
    		case 4:
    			return ItemHistorial.comparadorTipoAsc;
    		case 5:
    			return ItemHistorial.comparadorTipoDesc;
    		default:
    			return null;
		}
	}
	
	private String[] parseCarga(ContentResolver cr, String numero, ItemHistorialAdapter adapter)
	{
		if(numero.startsWith("+"))
		{
			numero=numero.substring(4);
		}
        String[] aux = cargarContacto(cr,numero, adapter);
		if(aux[0].compareTo("0")==0)
		{
			aux = cargarContacto(cr,"0"+numero, adapter);
		}
		
		return new String[]{aux[0],aux[1],numero};
	}

	public void deleteItemHistorial(ItemHistorial itemHistorial) {
		ContentResolver cr = context.getContentResolver();
		String[] params = new String []{String.valueOf(itemHistorial.getId())};
		if(itemHistorial instanceof Llamada){
			cr.delete(CallLog.Calls.CONTENT_URI, CallLog.Calls._ID+"=?", params);
	    }
		else if(itemHistorial instanceof Mensaje){
			switch (((Mensaje) itemHistorial).getSubtipo())
			{
				case 1:
					cr.delete(Uri.parse(CONTENT_SMS), ID+"=?", params);
					break;
				case 2:
					cr.delete(Uri.parse(CONTENT_MMS), ID+"=?", params);
					break;
				default:
					break;
			}
	    }
	}
}
